package ucla.axelia.vista;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import ucla.axelia.controlador.interfaces.IServicioAdministracionAsignarProgramasUsuarios;
import ucla.axelia.controlador.interfaces.IServicioAdministracionPrograma;
import ucla.axelia.modelo.dao.ServicioUsuarioProgramaDAO;
import ucla.axelia.modelo.data.DataGenerica;
import ucla.axelia.modelo.data.Programa;
import ucla.axelia.modelo.data.UsuarioPrograma;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Font;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.GridLayoutData;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.modelo.servicios.seguridad.IServicioAdministrarUsuarios;
import com.obelisco.modelo.data.Usuario;
import com.obelisco.vista.componentes.BotonesDialogo;
import com.obelisco.vista.componentes.Catalogo;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ComponenteTransaccionDatosListener;
import com.obelisco.vista.componentes.DialogoMensaje;
import com.obelisco.vista.componentes.DobleLista;
import com.obelisco.vista.componentes.TextFieldCatalogo;
import com.obelisco.vista.componentes.TextFieldCatalogoListener;
import com.obelisco.vista.componentes.TipoDialogo;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.BindingDateField;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;
import ucla.axelia.modelo.dao.*;
import ucla.axelia.modelo.pk.UsuarioProgramaId;

public class PaneUsuarioPrograma extends ContentPane implements ComponenteTransaccionDatosListener{
	
	//	Definicion de atributos
	private TextFieldCatalogo txtCatUsuario;
	private Catalogo catUsuario;
	private DobleLista dblProgramas;	
	
	private IServicioAdministracionAsignarProgramasUsuarios servicioAdministracionAsignarProgramasUsuarios; 
	private Usuario usuario;

	
	//Constructor
	public PaneUsuarioPrograma() {
		super();
	}		
	
	private TextFieldCatalogoListener txtCatUsuariosListener = new TextFieldCatalogoListener(){			
		public void onSeleccionar(Object objeto) {	
			usuario =(Usuario)objeto;
			txtCatUsuario.setText(usuario.getNombrecompleto());
			this.cargarDobleListaProgramasConFiltro();
		}
		
		private void cargarDobleListaProgramasConFiltro () {
			List lista = servicioAdministracionAsignarProgramasUsuarios.buscarProgramasPorUsuario(usuario.getLogin());
			dblProgramas.setDatosDestino(lista);
			
			List listaProgramas = servicioAdministracionAsignarProgramasUsuarios.buscarProgramas();
		    Iterator iterTodas = listaProgramas.iterator();
			List listaProgramasOrigen = new ArrayList();
			while (iterTodas.hasNext()) {
				Programa programa = (Programa) iterTodas.next();
				Iterator iterProgramasUsuarios = lista.iterator();
				boolean encontrado = false;
				while (iterProgramasUsuarios.hasNext() && !encontrado) {
					Programa programas = (Programa) iterProgramasUsuarios.next();
					if (programas.equals(programa)) {
						encontrado = true;
					}
				}
				if (!encontrado) {
					listaProgramasOrigen.add(programa);
				}
			}
			dblProgramas.setDatosOrigen(listaProgramasOrigen);	
		}
	};
	
	public void initComponents () { //aqui se define las interfaces	
		this.removeAll();
		this.setEnabled(true);
				
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Asignacion de Programas a Usuarios");
		this.setLayoutData(columnLayoutData);
		
		GridLayoutData gridLayout1por2 = new  GridLayoutData();
		gridLayout1por2.setAlignment( new Alignment(Alignment.CENTER, Alignment.CENTER));
		gridLayout1por2.setColumnSpan(4);
		gridLayout1por2.setRowSpan(1);
		gridLayout1por2.setBackground(new Color(0XEEF1F6));
		
		GridLayoutData gridLayout1por4 = new  GridLayoutData();
		gridLayout1por4.setColumnSpan(4);
		gridLayout1por4.setRowSpan(1);
		gridLayout1por4.setAlignment( new Alignment(Alignment.CENTER, Alignment.CENTER));
	
		GridLayoutData gridLayout1por1 = new  GridLayoutData();
		gridLayout1por1.setAlignment( new Alignment(Alignment.CENTER, Alignment.CENTER));
				
		Grid grid1 = new Grid();
		grid1.setStyleName("Obelisco.GridPaneDialogo");
		grid1.setSize(2); //Numero de columnas de la tabla
		grid1.setColumnWidth(0, new Extent(50, Extent.PERCENT)); //PX denota pixeles
		
		Label lblUsuario = new Label ("Usuario");		
		lblUsuario.setLayoutData(gridLayout1por1);
		txtCatUsuario = new TextFieldCatalogo(150);
		txtCatUsuario.setCatalogo(this.catUsuario);
		txtCatUsuario.addCatalogoListener(this.txtCatUsuariosListener);		
		grid1.add(lblUsuario);
		grid1.add(txtCatUsuario);
		
		dblProgramas = new DobleLista();
		dblProgramas.setLabelOrigen("Programas Disponibles");
		dblProgramas.setLabelDestino("Programas Adscritos");
		dblProgramas.setDatosDestino(new ArrayList());
		dblProgramas.setDatosOrigen(new ArrayList());
		Label lblProgramas=new Label("Programas");
		lblProgramas.setFont(new Font(null,1,null));
		lblProgramas.setLayoutData(gridLayout1por4);
		dblProgramas.setLayoutData(gridLayout1por4);
		grid1.add(dblProgramas);
		
		Column columna = new Column();
		columna.add(grid1);
		this.add(columna);		
	}
		
	public void onCancelar() {
		// TODO Auto-generated method stub	
	}

	private DialogoMensaje dialogo;
	private ActionListener manejadorEventoDialogo = new ActionListener() {
		public void actionPerformed(ActionEvent evento) {
		   dialogo.salir();
		}
	};
	
	public void onConfirmarCambios(Object arg0, TipoFuncion arg1, String arg2) {
		// TODO Auto-generated method stub	
		this.servicioAdministracionAsignarProgramasUsuarios.eliminarProgramasPorUsuario(usuario.getLogin());
		List listaProgramas = (List)this.dblProgramas.getDatosDestino();
		Iterator it = listaProgramas.iterator();
		Set listaProgramasSet = new HashSet(0);
		while (it.hasNext()){
			Programa programa = (Programa) it.next();
			UsuarioPrograma usuarioPrograma = new UsuarioPrograma();
			UsuarioProgramaId id = new UsuarioProgramaId();
			id.setPrograma(programa);
			id.setLogin(usuario.getLogin());
			usuarioPrograma.setId(id);
			listaProgramasSet.add(usuarioPrograma);
			usuarioPrograma.setEstado(DataGenerica.DATA_ACTIVO);
			this.servicioAdministracionAsignarProgramasUsuarios.guardarUsuarioPrograma(usuarioPrograma);
		}
		dialogo = DialogoMensaje.mostrar("Exito","Transaccion finalizada exitosamente",
				TipoDialogo.INFORMACION, BotonesDialogo.OK,
				manejadorEventoDialogo);
	}

	public void onConfirmarEliminacion(Object arg0) {
		// TODO Auto-generated method stub

	}

	public void onConsultar(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	public void onCrear() {
		// TODO Auto-generated method stub
	}

	public void onFuncionPersonalizada(Object arg0, TipoFuncion arg1, String arg2) {
		// TODO Auto-generated method stub
	}

	public void onIncluir(Object arg0) {
		// TODO Auto-generated method stub
	}

	public void onInicializar() {
		// TODO Auto-generated method stub
		this.initComponents();
	}

	public void onModificar(Object arg0) {
		// TODO Auto-generated method stub
	}

	public void onObjetoEntidad(Object arg0) {
		// TODO Auto-generated method stub

	}

	public boolean onValidarDatos(Object arg0, TipoFuncion arg1, String arg2) {
		// TODO Auto-generated method stub
		return true;
	}


	public void onListaParametros(List listaParametros) {
		// TODO Auto-generated method stub
		
	}

	public Object onBuscarObjetoEntidad() {
		// TODO Auto-generated method stub
		return null;
	}

	
	// Getter y Setter
	public Catalogo getCatUsuario() {
		return catUsuario;
	}

	public void setCatUsuario(Catalogo catUsuario) {
		this.catUsuario = catUsuario;
	}
	
	public IServicioAdministracionAsignarProgramasUsuarios getServicioAdministracionAsignarProgramasUsuarios() {
		return servicioAdministracionAsignarProgramasUsuarios;
	}

	public void setServicioAdministracionAsignarProgramasUsuarios(
			IServicioAdministracionAsignarProgramasUsuarios servicioAdministracionAsignarProgramasUsuarios) {
		this.servicioAdministracionAsignarProgramasUsuarios = servicioAdministracionAsignarProgramasUsuarios;
	}

}